Re: Pass an htttpbody on a GET request with NSURLRequest
Re: Pass an htttpbody on a GET request with NSURLRequest
- Subject: Re: Pass an htttpbody on a GET request with NSURLRequest
- From: Jens Alfke <email@hidden>
- Date: Sun, 05 Jul 2015 07:42:05 -0700
If you have input into the API, then you might also point out that the credentials in the XML are redundant since they're already present in the Authorization header.
—Jens
> On Jul 4, 2015, at 11:42 PM, Antonio Nunes <email@hidden> wrote:
>
> Thanks for that link Avi.
>
> By the way, I don’t want to do it this way, but this is what the API developer asked me to use. I’ll get back to him and will ask for a better API.
>
> -António
>
>> On 05 Jul 2015, at 07:18, Avi Drissman <email@hidden> wrote:
>>
>> You probably shouldn't be doing that. It violates the spirit of GET if not the letter of the spec.
>>
>> http://stackoverflow.com/questions/978061/http-get-with-request-body
>>
>> I wouldn't be surprised if your inability to make NSURLRequest do it was intentional on the part of the NSURLRequest designers.
>>
>> Avi
>>
>>> On Jul 5, 2015, at 01:55, Antonio Nunes <email@hidden> wrote:
>>>
>>> I have the following curl command to a web api, which retrieves some info:
>>> curl -X GET -H 'Authorization: Basic blabla' -H 'Content-Type: application/xml; charset=utf-8' -H 'Accept-Language: en' -d "<user><account_attributes><email>email@hidden</email><password>SomePassWord</password></account_attributes></user>" 'https://example.com/api/v1/endpoint
>>>
>>> The -d and xml-string are mandatory for this GET command. I haven’t been able to translate this into an equivalent NSURLRequest that gets accepted by the server. It appears that an HTTPBody on a GET request is not honoured by NSURLRequest.
>>>
>>> This is the code I use to make the request (on iOS):
>>> NSURLCredential *credential = [[WRTSServerEngine sharedServerEngine] savedCredentialsForHost:@“example.com"
>>> port:0
>>> protocol:@"https"
>>> realm:@“SomeRealm"];
>>>
>>> NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://example.com/api/v1/endpoint"]];
>>>
>>> NSString *authStr = [NSString stringWithFormat:@"%@:%@", credential.user, credential.password];
>>> NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
>>> NSString *authValue = [NSString stringWithFormat: @"Basic %@",[authData base64EncodedStringWithOptions:0]];
>>> [request setValue:authValue forHTTPHeaderField:@"Authorization"];
>>> [request setValue:@"nl, en-us" forHTTPHeaderField:@"Accept-Language"];
>>> [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
>>>
>>> NSString *infoAsXMLString = @"<user>";
>>> infoAsXMLString = [infoAsXMLString stringByAppendingString:@"<account_attributes>"];
>>> infoAsXMLString = [infoAsXMLString stringByAppendingFormat:@"<email>%@</email>", credential.user];
>>> infoAsXMLString = [infoAsXMLString stringByAppendingFormat:@"<password>%@</password>", credential.password];
>>> infoAsXMLString = [infoAsXMLString stringByAppendingString:@"</account_attributes>"];
>>> infoAsXMLString = [infoAsXMLString stringByAppendingString:@"</user>"];
>>> [request setHTTPBody:[infoAsXMLString dataUsingEncoding:NSUTF8StringEncoding]];
>>>
>>> NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
>>> sessionConfig.allowsCellularAccess = YES;
>>> NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
>>> self.task = [session dataTaskWithRequest:request
>>> completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
>>> NSLog(@"%@", error);
>>> }];
>>> [self.task resume];
>>>
>>> This results in the following error:
>>> Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7ffd0b5f7a00 {NSUnderlyingError=0x7ffd0b58be50 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)", NSErrorFailingURLStringKey=https://staging.wrts.nl/api/v1/existing_user, NSErrorFailingURLKey=https://staging.wrts.nl/api/v1/existing_user, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-4, NSLocalizedDescription=The network connection was lost.}
>>>
>>> If I do not set an HHTPBody on the request, I get a 500 error (which makes sense, since the server is expecting a payload in the body).
>>>
>>> Is there any way to get the HHTPBody sent along with the GET request?
>>>
>>> -António
>>>
>>>
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Macnetworkprog mailing list (email@hidden)
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>> This email sent to email@hidden
>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Macnetworkprog mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden