2017-06-10 10 views
1

私はこのリンクを使用しようとしていますhttps://congress.api.sunlightfoundation.com/bills/search?query=Taylor強制的に法案を照会してください。Swift Request Not Working

私のiOSアプリケーションでは、Webブラウザで同じURLを入力した場合の結果を得るためにpostStringパラメータ( "query =" TaylorForcedAct ")を使用しようとしています。残念ながら、私は403エラーを取得:

status code: 403, headers { "Content-Length" = 551; "Content-Type" = "text" 

私はブラウザで行う場合には、それが正常にデータを返しますが

私はなぜ、唯一のアドレスバーに、迅速使用して要求することにより、それをアクセスすることはできませんか。? ]

編集:すべてのエラーを申し訳ありません、私はこれを本当に深夜に書いています

Optional(<NSHTTPURLResponse: 0x608000038040> { URL: https://congress.api.sunlightfoundation.com/bills/search? } { status code: 403, headers { 
    "Content-Length" = 551; 
    "Content-Type" = "text/html"; 
    Date = "Sat, 10 Jun 2017 16:57:23 GMT"; 
    Server = CloudFront; 
    Via = "1.1 b4b2849aaf2c14969531f9514611da28.cloudfront.net (CloudFront)"; 
    "x-amz-cf-id" = "vH379ZK57HN6pqgCQsdWD7x_jv5_xTzB5uMX3krdoSRR92pKFKWeag=="; 
    "x-cache" = "Error from cloudfront"; 
} }) 
Requestttt = Optional(https://congress.api.sunlightfoundation.com/bills/search?) 
responseString = <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> 
<TITLE>ERROR: The request could not be satisfied</TITLE> 
</HEAD><BODY> 
<H1>ERROR</H1> 
<H2>The request could not be satisfied.</H2> 
<HR noshade size="1px"> 
Bad request. 
<BR clear="all"> 
<HR noshade size="1px"> 
<PRE> 
Generated by cloudfront (CloudFront) 
Request ID: vH379ZK57HN6pqgCQsdWD7x_jv5_xTzB5uMX3krdoSRR92pKFKWeag== 
</PRE> 
<ADDRESS> 
</ADDRESS> 
</BODY></HTML> 

と同じパラメータとURLを使ってブラウザの応答(https://congress.api.sunlightfoundation.com/bills/search?query=TaylorForceAct):

{"results":[],"count":0,"page":{"count":0,"per_page":20,"page":1}} 

ソリューション:ここSWIFTコードは

func authentication3() { 


let request = NSMutableURLRequest(url: URL(string: "https://congress.api.sunlightfoundation.com/bills/search?")!) 
request.httpMethod = "GET" 
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Accept") 



//let poststring = "query= TaylorForceAct" 
request.httpBody = "query=TaylorForceAct".data(using: String.Encoding.utf8) 
//request.addValue("\"Taylor Force Act\"", forHTTPHeaderField: "query") 
let task = URLSession.shared.dataTask(with: request as URLRequest) { 
    data, response, error in 

    if error != nil { 
     print("error=\(String(describing: error?.localizedDescription))") 
     return 
    } 

    print("response = \(String(describing: response))") 

    print("Requestttt = \(String(describing: request.url?.absoluteURL))") 

    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
    print("responseString = \(responseString ?? "L")") 
    } 
task.resume() 
    } 

と応答である私が馬鹿でしたGETを使って投稿しようとすると...正しい解決策は、選択された答えは次のとおりです。URLcomponetsを使用してURLを解析します。

+2

これまでに試したコードを表示すると、私たちがあなたを助けやすくなります。 –

+1

'GET'リクエストで' httpBody'を使うことはできません。 URLに '?query = ...'を追加する必要があります。 'Content-Type'も設定しないでください。 'GET'リクエストには内容がありません。 – Sulthan

+1

これを 'POST'として送信すると、応答に403ステータスコードが返されます。私はあなたのコンテンツの長さが551であったことに驚いています。このレスポンスでボディーが何であったかを見ると面白いでしょう(例えば、 'String(data:data!、encoding:utf8) ') – Rob

答えて

1

この特定のWebサービスはGETリクエストが必要です。リクエストがPOSTリクエストの場合は、403ステータスコードを送信します。

また、リクエストをエンコードする率を示唆しています(たとえば、あなたにはURLComponentsを使用できます)。したがって:

-1

403エラーコードは禁止されたアクセスを意味します。サービスの中には、指定されたUser-Agent http要求ヘッダーが存在しないという理由があります。あなたは、次のコードを試すことができます。

UserDefaults.standard.register(defaults: ["UserAgent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"]) 

をそして私が正しくあなたを理解していれば、あなたはPOSTメソッドを使用している再び

+0

ユーザエージェントの問題はそれほどありません。通常、問題は、セッションCookieがないか、ヘッダーが抜けていることです。 – Sulthan

+1

@Sulthan Answerの前に、私はブラウザの開発者コンソールでリクエストを調べました。クッキーはなく、標準のAccept、Cache-Control、User-Agentを除くhttpヘッダーはありません。 –

+0

これは公開APIなので、驚くべきことです。コードが誤って使用されているか、またはトランスポートセキュリティにぶつかっています。ユーザーエージェントは、APIがデバイスの基本情報としてのみ使用し、デバイスをブロックするのではないため、使用することはほとんどありません。 – Sulthan

2

I'm trying to use a postString parameter

リクエストをテストします。

これは間違っています。ブラウザにURLを書き込むときは、GETメソッドが使用されます。

POSTで403(禁止)応答が表示されます。この方法は明らかに(RESTクライアントで確認)検索APIによってサポートされていません。

+0

解説のために質問を編集しました。ありがとうございます。 GETだけが動作します。 https://congress.api.sunlightfoundation.com/bills/search?query=Taylorがブラウザで動作するのはなぜですか?私は迅速にURLリクエストを行っていませんか?多分私のコードは間違っています。 –